#pragma once
#ifndef SHARE_MEM_H
#define SHARE_MEM_H

#ifdef __cplusplus
extern "C" {
#endif

#include <stdint.h>
#include <sys/types.h>
#include <stdio.h>  
#include <sys/sem.h>  
#include <stdlib.h>  

#include "sharemem_base.h"
#include "tools_share.h"


enum USR_SEMS//用户空间线程用的信号量（内核与用户之间的临界数据不能用这些信号，必须用内核空间的信号量）
{
    USR_SEMID_RT_USRCMD,
    USR_SEMID_RT_STATUS,
    USR_SEMID_RT_SERVO_CTRL,
    USR_SEMID_RT_SENSOR,
    USR_SEMID_OTHER_ALL,
    USR_SEMID_COUNT//放到最后
};

typedef struct __attribute__((__packed__)) _struct_sub
{
    int8_t int8_t_1;
    int int_1;
    float float_1;
}struct_sub;

/******************共享内存B01位设置***********************/
enum B01_ //0-7
{
  B01_spi_enable,
  B01_walk_auto_enable,
  B01_walk_nagtive_enable,
  B01_SERVO_init_success
};

typedef struct __attribute__((__packed__)) real_time_data{//实时数据共享内存，存储当前状态
    //共享内存尽量保证4个int8_t一组，对齐，否则容易出现问题。（比如操作double指针，不同的机器人平台要求不同）
    /*USR_SEMID_RT_USRCMD*///信号量作用范围
    struct_sub s_cmd;
    /*end*/
    
    /*USR_SEMID_RT_STATUS*/
    uint8_t B01;//每个B0i可以表示8个BOOL变量
    uint8_t B02;
    uint8_t B03;
    uint8_t B04;
    int FSM_State;//当前外骨骼处于什么状态。
    int error_STATUS;
    /*end*/

    /*USR_SEMID_RT_SERVO_CTRL*/
    float model_Q[8];
    float UpDownPos;//升降位置
    float ChairAng;//座椅角度
    float LieAng;//仰躺角度
    /*end*/


} REAL_TIME_DATA;//本程序与外部程序的交互结构体


typedef struct __attribute__((__packed__)) s_other_data{
    /*USR_SEMID_OTHER_ALL*/
    double running_delt_time;
    double gait_angle;//
    /*end*/
}OTHER_DATA;



typedef struct __attribute__((__packed__)) s_data_all{//实时数据共享内存，存储当前状态
    REAL_TIME_DATA rt_data;//树梅派与上位机器通信的数据
    OTHER_DATA ot_data;//其他数据
    double test_dbl[4];
} DATA_ALL;//本程序与外部程序的交互结构体



extern struct share_buffer sbf;
extern DATA_ALL *sbf_pdata;//代替：((DATA_ALL *)p_sbf->pdata)

void test_sharemem_server_build(struct share_buffer *sb,int ftok_id);
void test_sharemem_client_build(struct share_buffer *sb,int ftok_id);

double* get_python_pointer(struct share_buffer *sb);

#ifdef __cplusplus
}
#endif
#endif


